package schemax

type ClassDecl struct {
	//
	Namespace string
	//
	Name string
	//
	Parent string
	// 如果Kind==Struct
	Fields []*Field
	//
	Comments []string
	//
	Tags map[string]string
}

func (decl *ClassDecl) GetName() string {
	return decl.Name
}

func (decl *ClassDecl) GetNamespace() string {
	return decl.Namespace
}

func (decl *ClassDecl) GetIdent() string {
	if decl.Namespace != "" {
		return decl.Namespace + "/" + decl.Name
	}
	return decl.Name
}

func (decl *ClassDecl) RefType() string {
	return "classdecl"
}

func (decl *ClassDecl) GetField(name string) (f *Field) {
	for _, val := range decl.Fields {
		if val.Name == name {
			return val
		}
	}

	p := decl.GetParent()
	if p != nil {
		return p.GetField(name)
	}

	return nil
}

func (decl *ClassDecl) GetParent() *ClassDecl {
	if decl.Parent == "" {
		return nil
	}

	ip := GetDeclByKey(decl.Parent)
	p, ok := ip.(*ClassDecl)
	if ok {
		return p
	}
	return nil
}

// GetAllField 获取类的属性字段，包括父类
func (decl *ClassDecl) GetAllField() (r []*Field) {
	cur := decl
	for {
		for _, val := range cur.Fields {
			r = append(r, val)
		}

		if cur.Parent == "" {
			return
		}

		ip := GetDeclByKey(cur.Parent)
		p, ok := ip.(*ClassDecl)
		if ok == false {
			return
		}
		cur = p
	}

}
